看到一个 Bob Nystrom 写的 C 语言实现的 Garbage Collector
借着这个小程序顺便深入地了解一下Lua的垃圾回收机制
Garbage Collector算法小结
这是之前做的一点小笔记:
C Garbage Collector
首先还是先来看看这个 C 的基本的垃圾回收器
采用的算法
用的是经典的 Mark & Sweep 算法
在上面的笔记里面已经介绍的很清楚了
该算法的工作原理几乎与我们对 可访问性(reachability) 的定义完全一样:
从根节点开始,依次遍历整个对象图。每当你访问到一个对象,在上面设置一个 标记(mark) 位,置为 true 。
一旦搞定,找出所有标记位为 not 的对象集,然后删除它们。
对象对
要想清理垃圾,首先我们得制造点垃圾出来
所以假设我们正在为一种简单的语言编写一个解释器。它是动态的类型并且有两种类型的变量:int 和 pair 。 下面是用枚举来标示一个对象的类型:
|
|
小虚拟机
虚拟机要么基于栈( JVM , CLR ),要么基于寄存器( Lua ),其实本质上说都是基于栈的,它用来保存一个表达式中间需要用到的临时变量和局部变量
下面我们建立一个简洁的虚拟机模型:
|
|
虚拟机的操作
|
|
Mark
|
|
Sweep
|
|
GC
|
|
对象操作函数
|
|
free、test、main
|
|
测试结果
总结
这个简单的收集器与目前 Ruby 和 Lua 中的收集器非常的相似,所以下一次我们将深入了解 Lua 的 GC 机制。